package main

/*
1. 反射创建结构体
2. 反射反序列化结构体
*/

import (
	"encoding/json"
	"fmt"
	"reflect"
)

type Student struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
	Sex  bool   `json:"sex"`
}

// 1. 反射创建结构体
func NewStruct() {
	var s1 *Student
	st := reflect.TypeOf(s1).Elem() // 获得指针指向的类型
	instancePtr := reflect.New(st)  // 创建一个指向结构体的指针为value类型
	instance := instancePtr.Elem()  // 返回指向的结构体实例
	instance.Field(0).SetString("bart")
	instance.Field(1).SetInt(16)
	instance.Field(2).SetBool(true)
	instanceInterface := instance.Interface()
	// 类型断言转换为Student结构体实例
	s2 := instanceInterface.(Student)
	fmt.Println(s2) //{bart 16 true}
}

// 2. 反射反序列化结构体
func DeserializedStruct() {
	jsonString := `
		{
			"name": "bart",
			"age": 16,
			"sex": true
		}
	`
	var stu Student
	err := deserialized(&stu, jsonString)
	if err != nil {
		fmt.Println("反序列化失败！", err)
	}
	fmt.Println("反序列化成功！", stu)

}

func deserialized(stu interface{}, jsonString string) (err error) {
	err = json.Unmarshal([]byte(jsonString), stu)
	return
}

func main() {
	DeserializedStruct()
}
